FreeRTOS 任务的创建与删除
FreeRTOS的任务函数原型为:
1void task(void* args);使用FreeRTOS的xTaskCreate函数来创建任务:
1#include <task.h>
2BaseType_t xTaskCreate(TaskFunction_t pxTaskCode,
3 const char * const pcName,
4 const uint16_t usStackDepth,
5 void * const pvParameters,
6 UBaseType_t uxPriority,
7 TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION;
8//返回值:成功返回pdPASS;失败返回errCOULD_NOT_ALLOCATE_REQUIRED_MEMORYpxTaskCode是任务函数,没有返回值(void),参数为void*pcName是任务的名字,用于调试,其长度不能超过configMAX_TASK_NAME_LENusStackDepth是任务的堆栈深度,其四倍即是堆栈的大小(字节数)pvParameters是传给任务函数的参数uxPriority是任务优先级,数值越大,优先级越高,0为最低优先级pxCreatedTask是返回的任务句柄
使用vTaskStartScheduler函数来开启任务调度:
1#include <task.h>
2void vTaskStartScheduler(void);FreeRTOS的任务函数不能返回,对于不再需要的任务,应当使用vTaskDelete函数来进行删除,其参数是xTaskCreate最后一个参数返回的任务句柄,将参数设为NULL表示删除当前任务:
1#include <task.h>
2void vTaskDelete(TaskHandle_t xTaskToDelete);下面是一个例子,创建两个任务,通过串口打印消息:
1#include <stm32f4xx.h>
2#include <FreeRTOS.h>
3#include <task.h>
4#include <uart.h>
5
6void task1(void* args);
7void task2(void* args);
8
9int main()
10{
11 //配置USART1
12 USART1_Config();
13 //创建任务
14 TaskHandle_t h1,h2;
15 xTaskCreate(task1,"task1",configMINIMAL_STACK_SIZE,"hello\n",1,&h1);
16 xTaskCreate(task2,"task2",configMINIMAL_STACK_SIZE,"world\n",1,&h2);
17 //开启任务调度
18 vTaskStartScheduler();
19 while(1);
20}
21
22
23void task1(void* args)
24{
25 int i = 0;
26 while(1)
27 {
28 //循环5次后删除自己
29 if(i >= 5)
30 {
31 vTaskDelete(NULL);
32 }
33 //打印参数
34 USART_printf(USART1,args);
35 //延时1000ms
36 vTaskDelay(1000/portTICK_RATE_MS);
37 i++;
38 }
39}
40
41void task2(void* args)
42{
43 int i = 0;
44 while(1)
45 {
46 //循环10次后删除自己
47 if(i >= 10)
48 {
49 vTaskDelete(NULL);
50 }
51 //打印参数
52 USART_printf(USART1,args);
53 //延时1000ms
54 vTaskDelay(1000/portTICK_RATE_MS);
55 i++;
56 }
57}附.USART代码代码 :
1/**
2 * @file uart.c
3 * @author PlanC
4 * @blog www.kurukurumi.com
5 * @brief configure USART1 to print message
6 */
7
8#include <stdarg.h>
9#include <stdio.h>
10#include <stm32f4xx.h>
11#include <uart.h>
12
13/**
14 * @brief Initialize the USART1
15 * @note set USART1_RX GPIOA10 as push-pull output
16 * set USART1_TX GPIOA9 as pull-up input
17 * set USART1 as 115200-8-N-1
18 */
19void USART1_Config(void)
20{
21 GPIO_InitTypeDef gpio;
22 USART_InitTypeDef usart;
23
24 // enable the perpheral clock
25 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
26 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
27
28 gpio.GPIO_Mode = GPIO_Mode_AF;
29 gpio.GPIO_PuPd = GPIO_PuPd_UP;
30 gpio.GPIO_OType = GPIO_OType_PP;
31 gpio.GPIO_Speed = GPIO_High_Speed;
32
33 //set UART1_RX GPIOA10 as push-pull output
34 gpio.GPIO_Pin = GPIO_Pin_10;
35 GPIO_Init(GPIOA,&gpio);
36 GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
37
38 //set UART1_TX GPIOA9 as pull-up input
39 gpio.GPIO_Pin = GPIO_Pin_9;
40 GPIO_Init(GPIOA,&gpio);
41 GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
42
43 //set USART1 as 115200-8-N-1
44 usart.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
45 usart.USART_BaudRate = 115200;
46 usart.USART_WordLength = USART_WordLength_8b;
47 usart.USART_Parity = USART_Parity_No;
48 usart.USART_StopBits = USART_StopBits_1;
49 USART_Init(USART1,&usart);
50 USART_Cmd(USART1,ENABLE);
51}
52
53
54/**
55 * @brief Send a byte data from USART
56 * @param port: the USART which will be used
57 * @param data: the data which will be sent
58 */
59
60void USART_WriteByte(USART_TypeDef* port,uint8_t data)
61{
62 USART_SendData(port,data);
63 while(USART_GetFlagStatus(port,USART_FLAG_TXE) == RESET);
64}
65
66
67/**
68 * @brief print a format string from USART
69 * @param port: the USART which will be used
70 * @param fmt: the format string
71 *
72 */
73
74#define USART_PRINTF_BUFFER_SIZE 256
75
76int USART_printf(USART_TypeDef* port,const char* fmt,...)
77{
78 char str[USART_PRINTF_BUFFER_SIZE];
79 int length,index;
80 va_list argList;
81 va_start(argList,fmt);
82 length = vsnprintf(str,USART_PRINTF_BUFFER_SIZE-1,fmt,argList);
83 va_end(argList);
84 for(index = 0 ; index < length ; index++)
85 {
86 USART_WriteByte(port,str[index]);
87 }
88 return length;
89}